/**
 * Created by ly on 2017/10/12.
 */

var hlNumberUtil = (function() {
	var numberUtil = {
		//中英字符长度
		fucCheckLength: function(str) {
			var i, sum;
			sum = 0;
			for (i = 0; i < str.length; i++) {
				if ((str.charCodeAt(i) >= 0) && (str.charCodeAt(i) <= 255)) {
					sum = sum + 1;
				} else {
					sum = sum + 2;
				}
			}
			return sum;
		},
		isString: function(string) {
			if (typeof string === 'string') {
				return string
			} else {
				console.error('传入参数不是字符串类型')
			}
		},
		isNumber: function(num) {
			if (typeof num === 'number') {
				return num
			} else {
				console.error('传入参数不是数字类型')
			}
		},
		isBoolean: function(boolean) {
			if (typeof boolean === 'boolean') {
				return boolean
			} else {
				console.error('传入参数不是布尔类型')
			}
		},
		isFunction: function(obj) {
			if (typeof obj === 'function') {
				return obj
			} else {
				console.error('传入参数不是函数类型')
			}
		},
		isArray: function(arr) {
			return typeof arr === 'object' && arr instanceof Array
		},
		isRegExp: function(regExp) {
			return typeof regExp === 'object' && regExp instanceof RegExp
		},
		isDate: function(date) {
			return typeof date === 'object' && date instanceof Date
		},
		isEmptyObject: function(obj) {
			var name;

			for (name in obj) {
				return false
			}

			return true
		},
		isNull: function(str) {
			if (str === "") return true;
			var regu = "^[ ]+$";
			var re = new RegExp(regu);
			return re.test(str);
		},
		/**
		 * 判断是否是整数
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		validateIsInt: function(num) {
			var reg1 = /^[0-9]{0,}$/,
				reg2 = /^[1-9]{1}[0-9]{0,}$/,
				num = Math.abs(this.valueTrim(num));

			if (num == null || num.length === 0) {
				return false;
			}

			//判断当数字只有1位时
			if (num.length < 2) {
				return reg1.test(num);
			}

			return reg2.test(num);
		},
		/**
		 * 判断是否为非0整数
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		validateIsNonZeroInt: function(num) {
			if (num == 0) return false;
			return this.validateIsInt(num)
		},
		/**
		 * 判断是否是浮点数
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		isFloat: function(num) {
			var reg = /^(\d+)(\.\d+)$/,
				num = this.valueTrim(num);

			if (num == null || num.length === 0) {
				return false;
			}

			return reg.test(num)
		},
		/**
		 * 判断是否是数字
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		isNum: function(num) {
			if (isNaN(num)) {
				return false
			}
			return true
		},
		/**
		 * 判断是否是大于0或等于0的数字
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		isPositiveNumber: function(num) {
			if (isNaN(num)) {
				return false
			}
			if (num < 0) {
				return false
			}
			return true
		},
		/**
		 * 检测是否超过两位小数
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		isTwoDecimalPlaces: function(num) {
			var len = num.length;
			var intLen = this.intLength(num)
			if (len <= intLen + 3) return true;
			if (len > intLen + 3) return false;
		},
		/**
		 * 返回所检测的数字整数位位数
		 * @param  { String || Number} num 要验证的数据
		 * @returns {Boolean}
		 */
		intLength: function(str) {
			if (typeof str === 'number') str = str.toFixed(2)
			if (typeof str === undefined) console.error('输入内容不能为空')
			if (str.indexOf('.') === -1) return str.length
			if (str.indexOf('.') !== -1) {
				return str.indexOf('.')
			}
		},
		/**
		 *
		 * @param {number} v   处理的数字
		 * @param {number} x   需要保留的小数位
		 * @param {[number]} type=1  1. 四舍五入  2.向上取整  3.向下取整
		 * @return {number}
		 */
		decimalProcessing: function(v, x, type) {
			var result = 0;

			switch (type) {
				case "1":
					result = v.toFixed(x);
					break;
				case "2":
					result = Math.ceil(v);
					break;
				case "3":
					result = Math.floor(v);
					break;
				default:
					result = v.toFixed(x);
					break;
			}

			return result;
		},
		// 去除字符串首尾空白符
		valueTrim: function(text) {
			return text == null ?
				"" :
				(text + "").replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
		},
		/**
		 * 去除字符串末尾的符号
		 * @param  {String} str
		 * @param  {[String]} sybmol = ','
		 * @return {String}
		 */
		deleteSybmolAtEndOfString: function(str, sybmol) {
			this.isString(str)

			if (typeof sybmol === 'undefined') {
				sybmol = ','
			} else {
				this.isString(sybmol)
			}

			var length = str.length - 1;

			if (str.charAt(length) === sybmol) {
				return str = str.substring(0, str.lastIndexOf(sybmol))
			}

			return str
		},
		/**
		 * 分割数字，每隔三位数字用，分隔
		 * @param  {str} str || number
		 * @return {string}
		 */
		formatNum: function(number0) {
			if (isNaN(number0)) return '0.00';
			Number.prototype.tofixed = function(n) {
				if (n > 20 || n < 0) {
					throw new RangeError('toFixed() digits argument must be between 0 and 20');
				}
				const number = this;
				if (isNaN(number) || number >= Math.pow(10, 21)) {
					return number.toString();
				}
				if (typeof(n) == 'undefined' || n == 0) {
					return (Math.round(number)).toString();
				}

				let result = number.toString();
				const arr = result.split('.');

				// 整数的情况
				if (arr.length < 2) {
					result += '.';
					for (let i = 0; i < n; i += 1) {
						result += '0';
					}
					return result;
				}

				const integer = arr[0];
				const decimal = arr[1];
				if (decimal.length == n) {
					return result;
				}
				if (decimal.length < n) {
					for (let i = 0; i < n - decimal.length; i += 1) {
						result += '0';
					}
					return result;
				}
				result = integer + '.' + decimal.substr(0, n);
				const last = decimal.substr(n, 1);

				// 四舍五入，转换为整数再处理，避免浮点数精度的损失
				if (parseInt(last, 10) >= 5) {
					const x = Math.pow(10, n);
					result = (Math.round((parseFloat(result) * x)) + 1) / x;
					result = result.toFixed(n);
				}

				return result;
			}

			let num = Number(number0).tofixed(2);
			return num.replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
		},
		/**
		 * 格式化小数点后两位小数
		 * @param  {str} str || number
		 * @return {string}
		 */
		formatTwoDecimal: function(str) {
			if (str == undefined) return
			return Number(str).toFixed(2)
		},
		/**
		 * 去除数字中的，
		 * @param  {str} str || number
		 * @return {string}
		 */
		formatThousandsNum: function(str) {
			if (typeof str == 'number') str = str.toString()
			return str.replace(/,/g, "")
		},
		/**
		 *  格式化数字  如  1  ---> 01
		 * @param  {str || number}
		 * @return {number}
		 */
		formatPaddingNum: function(num) {
			return num < 10 ? '0' + num : num;
		}

	}
	return numberUtil
}());
